package com.leetcodehot.problems;

public class problems2529 {
    /**
     * 看到一个二分的经典模板
     * 最容易的想象的版本是 左开右开的版本。初始红蓝两个颜色的分界线是不确定的。
     * 通过每次观察m元素应该是蓝色还是红色 移动left和right
     * 再根据题意看最终需要取的是left还是right
     * <p>
     * int left = -1;
     * int right = n;
     * while(left+1!=right){
     * int mid = left + (right - left) //2
     * if(isBule(mid)){
     * l = m;
     * }else{
     * r = m;
     * }
     * }
     * return l or r;
     */


    /**
     * 给你一个按 非递减顺序 排列的数组 nums ，返回正整数数目和负整数数目中的最大值。
     * <p>
     * 换句话讲，如果 nums 中正整数的数目是 pos ，而负整数的数目是 neg ，返回 pos 和 neg二者中的最大值。
     * 注意：0 既不是正整数也不是负整数。
     * <p>
     * 题目转换成二分查找
     */
    public int maximumCount(int[] nums) {
        int n = nums.length;
        int left = -1, right = n;
        while (left + 1 != right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < 0) {
                left = mid;
            } else {
                right = mid;
            }
        }
        //这里取left
        if (left == n - 1) return n;
        int pre = left;
        left = -1;
        right = n;
        while (left + 1 != right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < 1) {
                left = mid;
            } else {
                right = mid;
            }
        }
        //这里取right

        if (right == 0) return n;
        return Math.max(pre + 1, n - right);
    }
}
